package com.allen.retrofit2_rxjava2.web;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.PermissionRequest;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

import com.allen.retrofit2_rxjava2.R;
import com.allen.retrofit2_rxjava2.base.BaseActivity;
import com.allen.retrofit2_rxjava2.utils.MainUtil;
import com.ieyelf.service.util.Logger;

import butterknife.BindView;


/**
 *
 */

public class WebViewActivity extends BaseActivity {

    @BindView(R.id.webView)
    WebView webView;
    String callback;

    @Override
    public void init() {
        setContentView(R.layout.activity_web);
    }

    @Override
    public void data() {
        MainUtil.log("22222222222222");
        String urls = "file:///android_asset/html/logindemo.html";
        initWebView(urls);
    }


//    @Override
//    public void onResume() {
//        super.onResume();
//        if (null != webView) {
//            webView.onResume();
//            webView.invalidate();
//        }
//
//    }

    @TargetApi(19)
    private void openDebug() {
        webView.setWebContentsDebuggingEnabled(true);
    }

    /**
     * 初始化WebView
     */
    @SuppressWarnings("deprecation")
    @SuppressLint("SetJavaScriptEnabled")
    private void initWebView(String url) {

        webView.setBackgroundColor(Color.WHITE);
        webView.getSettings().setDefaultTextEncodingName("UTF-8");// 设置默认编码方式
//        webView.getSettings().setSupportZoom(true);
        webView.getSettings().supportMultipleWindows();
        webView.getSettings().setJavaScriptEnabled(true);//支持js
//        mWebView.getSettings().setBuiltInZoomControls(true);
        // 扩大比例的缩放
        webView.getSettings().setUseWideViewPort(true);
        //openDebug();
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

        webView.getSettings().setDatabaseEnabled(false);// 数据库缓存
//        webView.getSettings().setAppCacheEnabled(true);// 打开缓存
//        webView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);// 设置最大缓存
        webView.getSettings().setAllowContentAccess(true); // 是否可访问Content Provider的资源，默认值 true
        webView.getSettings().setAllowFileAccess(true);    // 是否可访问本地文件，默认值 true=
        webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);// 提高渲染级别
        webView.getSettings().setLoadsImagesAutomatically(true);// 自动加载网络图片
        webView.getSettings().setDomStorageEnabled(true);// 打开dom storage缓存
        // 是否允许通过file url加载的Javascript读取本地文件，默认值 false
        webView.getSettings().setAllowFileAccessFromFileURLs(false);
        // 是否允许通过file url加载的Javascript读取全部资源(包括文件,http,https)，默认值 false
        webView.getSettings().setAllowUniversalAccessFromFileURLs(false);
       /*
        // 开启 DOM storage API 功能

        //开启 database storage API 功能
        webView.getSettings().setDatabaseEnabled(true);
        String cacheDirPath = getActivity().getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;
//      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;
        //设置数据库缓存路径
        webView.getSettings().setDatabasePath(cacheDirPath);
        //设置  Application Caches 缓存目录
        webView.getSettings().setAppCachePath(cacheDirPath);
        //开启 Application Caches 功能
        webView.getSettings().setAppCacheEnabled(true);*/


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        // 自适应屏幕
        webView.getSettings().setLayoutAlgorithm(
                WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        webView.getSettings().setLoadWithOverviewMode(true);


        //给web提供调用接口
        webView.addJavascriptInterface(new DinaBindData(), "Scan");
        webView.getSettings().setDomStorageEnabled(true);
        //<input type="button" value="close" onClick="window.Scan.scanCode()" />
        Logger.verbose(url);
        webView.loadUrl(url);

        // WebViewClient负责截获并修改加载网页过程中的各种事件。首先给mWebView设置一个新的WebViewClient，
        // 然后重写函数shouldOverrideUrlLoading。这么做的原因保证点击WebView插件中的Url链接的时候，
        // 仍然是在WebView插件中显示页面，而不是调用系统的网络浏览器。
        webView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Logger.verbose("11111111");
                view.loadUrl(url);
                return true;
            }

            // 以下是在WebViewClient中，截获并且修改其它的事件行为的代码。
            // 例子代码中截获的事件包括网页加载前，加载后，错误，重复提交，加载资源等。
            // 比如，发生网页错误的时候，可以用自己的错误信息取代浏览器插件的错误提示。
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
            }

            public void onFormResubmission(WebView view, Message dontResend,
                                           Message resend) {
            }

            public void onPageStarted(WebView view, String url, Bitmap favicon) {
            }

            public void onPageFinished(WebView view, String url) {
            }

            @Override
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                super.doUpdateVisitedHistory(view, url, isReload);
            }
        });
        // WebChromeClient负责处理Javascript的对话框，网站图标，加载进度条等。下面的代码，在Activity上添加一个加载网页的进度条
        webView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                setProgress(progress * 100);
            }

            // 拦截输入框(原理同方式2)
            // 参数message:代表promt（）的内容（不是url）
            // 参数result:代表输入框的返回值
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                // 根据协议的参数，判断是否是所需要的url(原理同方式2)
                // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
                //假定传入进来的 url = "js://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）

                return super.onJsPrompt(view, url, message, defaultValue, result);
            }

            //通过alert()和confirm()拦截的原理相同，此处不作过多讲述

            // 拦截JS的警告框
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            // 拦截JS的确认框
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            // For Android < 3.0
            public void openFileChooser(ValueCallback<Uri> valueCallback) {

                Logger.verbose("Android < 3.0");
            }

            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onPermissionRequest(PermissionRequest request) {
                request.grant(request.getResources());
            }

            // For Android  >= 3.0
            public void openFileChooser(ValueCallback valueCallback, String acceptType) {

                Logger.verbose("Android  >= 3.0");
            }

            //For Android  >= 4.1
            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {

                Logger.verbose("Android  >= 4.1");
            }

            // For Android >= 5.0
            @Override
            @SuppressLint("NewApi")
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {


                Logger.verbose("Android >= 5.0");
                return true;
            }

        });


        //添加下面2行代码来忽略SSL验证
        WebViewClient mWebviewclient = new WebViewClient() {
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }
        };
        webView.setWebViewClient(mWebviewclient);
    }


    public boolean isHomePage() {
        return !webView.canGoBack();
    }

    public void webViewGoback() {
        webView.goBack();
    }

    public boolean canWebViewGoBack() {
        if (null != webView) {
            return webView.canGoBack();
        } else {
            return false;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (null != webView) {
            try {
                webView.stopLoading();
                webView.getSettings().setJavaScriptEnabled(false);
                webView.clearHistory();
                webView.removeAllViews();
                webView.destroy();
            } catch (Exception e) {
            }
        }
    }


    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            if (webView.canGoBack()) {
                webView.goBack();
            } else {
                finish();
            }
            return true;
        }
        return super.dispatchKeyEvent(event);
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 处理返回键，在webview界面，按下返回键，不退出程序
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (webView.canGoBack()) {
                webView.goBack();
                return true;
            } else {
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onPause() {
        super.onPause();
        webView.onPause();
    }


    /**
     * 调用js的方法传递code
     *
     * @param data 需要传递的数据
     */
    private void sendJSvalues(String data) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  //sdk>19才有
            //String jsMethodName = "XXX()"; //不需要参数的JS函数名
            String jsMethodName = "javascript:" + callback + "('" + data + "') "; //需要参数的JS函数名
            webView.evaluateJavascript(jsMethodName, new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String responseJson) { //这里传入的参数就是JS函数的返回值
                    Logger.verbose("调用js返回值:" + responseJson);
                }
            });
        } else {
            //SDK <= 19，暂时没找到方案
        }


    }

    /**
     * 向js提供的对象 执行扫码
     */
    public class DinaBindData {
        /**
         * 被js调用的方法 向js传递数据
         *
         * @param cameraCallback js返回的方法名
         */
        @JavascriptInterface
        public void scanCode(String cameraCallback) {
            Logger.verbose(cameraCallback);
            callback = cameraCallback;
        }

        /**
         * 接受js数据
         * @param h5
         */
        @JavascriptInterface
        public void getData(String h5) {
            Logger.verbose(h5);
            //h5地址
            String url = h5;

        }

        /**
         * 直接向js传递数据
         *
         * @return
         */
        @JavascriptInterface
        public String sendJsToData() {
            return "123455";

        }
    }


}